/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.smart.service.util;

import org.apache.log4j.Logger;

/**
 * 
 * @author arthur
 */
public class Logging {


	/** Inst�ncia real do logger GERAL */
	private Logger logger = null;


	/**
	 * getters and setters
	 */
	public void setLogger(Logger mlogger) {
		this.logger = mlogger;
	}


	/**
	 * Retorna a inst�ncia do Logger. O par�metro deste m�todo deve ser
	 * <b>getClass().getName()</b>.
	 * 
	 * @param className
	 *            Nome da classe que est� querendo o Logger
	 * @return Inst�ncia do Logger
	 */
	private String className;
	public static Logging getLogger(String className) {
		Logging result = new Logging();
		result.className = className + ".";
		result.setLogger(org.apache.log4j.Logger.getLogger(className));
		return result;
	}

	/**
	 * Escreve uma informa��o de debug no log, caso o debug esteja habilitado.
	 * 
	 * @param object
	 *            Mensagem que deve ser escrita.
	 */
	public void debug(Object object, Object... params) {
		System.out.println(className + formatLogMessage(object, params));
		if (logger.isDebugEnabled()) {
			logger.debug(formatLogMessage(object, params));
		}

	}

	/**
	 * Escreve uma informa��o de debug no log, caso o debug esteja habilitado.
	 * 
	 * @param object
	 *            - Mensagem que deve ser escrita
	 * @param t
	 *            - Exce��o que tamb�m deve ser logada
	 */
	public void debug(Object object, Throwable t, Object... params) {
		System.out.println(className + formatLogMessage(object, params));
		if (logger.isDebugEnabled()) {
			logger.debug(formatLogMessage(object, params), t);
			
		}
	}

	/**
	 * Escreve uma informa��o de erro no log.
	 * 
	 * @param object
	 *            - Mensagem que deve ser escrita
	 */
	public void error(Object object, Object... params) {
		logger.error(formatLogMessage(object, params));
	}

	/**
	 * Escreve uma mensagem do tipo ERROR no log, caso o erro esteja habilitado
	 * 
	 * @param object
	 *            - Mensagem do tipo ERROR a ser escrita
	 */
	public void error(Object object, Throwable t, Object... params) {
		t.printStackTrace();
		logger.error(formatLogMessage(object, params), t);
	}

	/**
	 * Escreve uma mensagem do tipo INFO no log, caso o info esteja habilitado
	 * 
	 * @param object
	 *            - Mensagem do tipo INFO a ser escrita
	 */
	public void info(Object object, Object... params) {
		if (logger.isInfoEnabled()) {
			logger.info(formatLogMessage(object, params));
		}

	}

	/**
	 * Escreve uma mensagem do tipo INFO no log, caso o info esteja habilitado
	 * 
	 * @param object
	 *            - Mensagem do tipo INFO a ser escrita
	 */
	public void info(Object object, Throwable t, Object... params) {
		if (logger.isInfoEnabled()) {
			logger.info(formatLogMessage(object, params), t);
		}
	}

	/**
	 * Escreve uma mensagem do tipo WARN no log, caso o info esteja habilitado
	 * 
	 * @param object
	 *            - Mensagem do tipo WARN a ser escrita
	 */

	public void warn(Object object, Object... params) {
		logger.warn(formatLogMessage(object, params));
	}

	/**
	 * Escreve uma mensagem do tipo WARN no log, caso o info esteja habilitado
	 * 
	 * @param object
	 *            - Mensagem do tipo WARN a ser escrita
	 */

	public void warn(Object object, Throwable t, Object... params) {
		logger.warn(formatLogMessage(object, params), t);
	}

	/**
	 * Verifica se o debug est� habilitado.
	 */
	public boolean isDebugEnabled() {
		return logger.isDebugEnabled();
	}

	/**
	 * Verifica se a escrita de mensagens do tipo INFO est� ativada.
	 * 
	 * @return Se a escrita do tipo INFO est� ativada
	 */
	public boolean isInfoEnabled() {
		return logger.isInfoEnabled();
	}

	/**
	 * Exemplo:
	 * log.debug("Creating new order for user: #0 product: #1 quantity: #2",
	 * user.username(), product.name(), quantity);
	 */
	private static String formatLogMessage(Object msg, Object... params) {
		if (msg == null) {
			return null;
		}
		String str = msg.toString();
		if (params != null) {
			for (Object p : params) {
				if (p != null) {
					str = str.replaceFirst("#\\d+", p.toString());
				}
			}
		}
		return str;
	}

}
